///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: server.c
//* 功能描述: 系统日志
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* QQ:	2085827949
//**********************************************************************/
#include "lapSever.h"

#include "lap_lib.h"
#include "laperro.h"




/*********************************************************************************
** 函数名称: lap_creatSever
** 功能描述: 创建一个tcp服务器
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return response .
**********************************************************************************/
int lap_creatSever(LapServerInit* severInit)
{
	int  ret = -1;
	
	// 判断severInit
	isNull(severInit,"服务器初始化结构体为空",-1);

	// //创建子进程
	// pid_t pid = -1;
	// pid =fork();
	// if(pid < 0)		//创建子进程出错
	// {
	// 	lap_syslog("lap_creatSever fork Err!");
	// 	return -1;
	// }
	// else if(pid >0)//这是父进程
	// {
	// 	exit(0);	
	// }

	char buff[256]={0};
	sprintf(buff,"%s/%s/%d/sever.log\0",severInit->workDir,severInit->ip,severInit->port);
	//打开服务器系统日志
	lap_openlog(buff,"LapSever");

	//单例运行
	sprintf(buff,"%s/%s/%d/sing.lap\0",severInit->workDir,severInit->ip,severInit->port);
	//lap_single(buff);
	
	//打印日志: 子进程创建成功
	lap_syslog("lap_creatSever Son fork created!");

	//将子进程变成守护进程
	//lap_daemon(severInit->workDir);

	//创建TCP/IP服务器
	// 1、创建socket
	// 2、命名套接字,绑定本地的ip地址和端口
	// 3、监听本地套接字
	
	//1、创建socket
	int fd_sck = -1;
	fd_sck = socket(AF_INET, SOCK_STREAM, 0);
	if (fd_sck < 0)
	{
		lap_syslog("lap_creatSever socket Err!");
		exit(-1);
	}
	
	// 2、命名套接字
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family  = AF_INET;						// 设置地址族
	addr.sin_port    = htons(severInit->port);		// 设置本地端口
	addr.sin_addr.s_addr = inet_addr(severInit->ip);//自定义IP
	
	//绑定本地的ip地址和端口
	ret = bind(fd_sck,(struct sockaddr *)&addr, sizeof(addr));
	if (ret == -1)
	{
		lap_syslog("lap_creatSever bind Err!");
		exit(-1);
	}
	
	lap_syslog("服务器运行中ing....");

	// 3、监听本地套接字
	ret = listen(fd_sck, 50);
	if (ret == -1)
	{
		lap_syslog("lap_creatSever listen Err!");
		exit(-1);
	}

	lap_syslog("lap_creatSever 等待客服端连接....");

	// 处理客户端连接
	while(1)
	{
		struct sockaddr_in client_addr;
		int len = sizeof(client_addr);
		int fd_act = -1;

		//阻塞，等待客服端连接
		fd_act = accept(fd_sck, (struct sockaddr *)&client_addr, (socklen_t *)&len);
		if (fd_act == -1)
		{
			lap_syslog("lap_creatSever accept Err!");
			return -1;
		}
		
		lap_syslog("lap_creatSever 客服端连接成功....");

		//创建一个线程去处理客户端的请求，主线程依然负责监听
		pthread_t id = -1;
		pthread_create(&id, NULL, severInit->Handler, (void *) fd_act);	
		pthread_detach(id); 	// 分离线程(子线程退出后 资源自动回收)
	}
	return 0;
}



//创建一个TCP/IP服务器
int lap_TcpSever(LapServerInit* severInit)
{
	return lap_creatSever(severInit);
}

#if 0
int main(void)
{
	lap_creatSever();
	

	return 0;
}
#endif
																	 
